package org.xxpay.service.impl;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.xxpay.core.entity.AlipayPayOrder;
import org.xxpay.core.entity.AlipayPayOrderExample;
import org.xxpay.core.service.IAlipayPayOrderService;
import org.xxpay.service.dao.mapper.AlipayPayOrderMapper;

import java.util.Date;
import java.util.List;

@Service
public class AlipayPayOrderServiceImpl implements IAlipayPayOrderService {

    @Autowired
    AlipayPayOrderMapper alipayPayOrderMapper;

    @Override
    public int createAlipayPayOrder(AlipayPayOrder alipayPayOrder) {
        return alipayPayOrderMapper.insertSelective(alipayPayOrder);
    }

    @Override
    public int update(AlipayPayOrder alipayPayOrder) {
        return alipayPayOrderMapper.updateByPrimaryKeySelective(alipayPayOrder);
    }

    @Override
    public int deleteByPayOrderId(String payOrderId) {
        return alipayPayOrderMapper.deleteByPrimaryKey(payOrderId);
    }

    @Override
    public AlipayPayOrder find(AlipayPayOrder alipayPayOrder, Date createTimeStart, Date createTimeEnd) {
        AlipayPayOrderExample example = new AlipayPayOrderExample();
        example.setOrderByClause("appHeartTime asc");
        AlipayPayOrderExample.Criteria criteria = example.createCriteria();
        setCriteria(criteria, alipayPayOrder, createTimeStart, createTimeEnd);
        List<AlipayPayOrder> alipayPayOrderList = alipayPayOrderMapper.selectByExample(example);
        if(CollectionUtils.isEmpty(alipayPayOrderList)) return null;
        return alipayPayOrderList.get(0);
    }

    @Override
    public List<AlipayPayOrder> selectList(AlipayPayOrder alipayPayOrder) {
        AlipayPayOrderExample example = new AlipayPayOrderExample();
        AlipayPayOrderExample.Criteria criteria = example.createCriteria();
        setCriteria(criteria, alipayPayOrder);
        List<AlipayPayOrder> alipayPayOrderList = alipayPayOrderMapper.selectByExample(example);
        return alipayPayOrderList;
    }

    @Override
    public AlipayPayOrder findByPayOrderId(String payOrderId) {
        return alipayPayOrderMapper.selectByPrimaryKey(payOrderId);
    }

    @Override
    public List<AlipayPayOrder> select(int offset, int limit, AlipayPayOrder alipayPayOrder, Date createTimeStart, Date createTimeEnd) {
        AlipayPayOrderExample example = new AlipayPayOrderExample();
        example.setOrderByClause("createTime desc");
        example.setOffset(offset);
        example.setLimit(limit);
        AlipayPayOrderExample.Criteria criteria = example.createCriteria();
        setCriteria(criteria, alipayPayOrder, createTimeStart, createTimeEnd);
        return alipayPayOrderMapper.selectByExample(example);
    }

    @Override
    public Integer count(AlipayPayOrder alipayPayOrder, Date createTimeStart, Date createTimeEnd) {
        AlipayPayOrderExample example = new AlipayPayOrderExample();
        AlipayPayOrderExample.Criteria criteria = example.createCriteria();
        setCriteria(criteria, alipayPayOrder, createTimeStart, createTimeEnd);
        return alipayPayOrderMapper.countByExample(example);
    }

    void setCriteria(AlipayPayOrderExample.Criteria criteria, AlipayPayOrder alipayPayOrder, Date createTimeStart, Date createTimeEnd) {
        if(alipayPayOrder != null) {
            if(StringUtils.isNotBlank(alipayPayOrder.getPayOrderId())) criteria.andPayOrderIdEqualTo(alipayPayOrder.getPayOrderId());
            if(StringUtils.isNotBlank(alipayPayOrder.getTradeNo())) criteria.andTradeNoEqualTo(alipayPayOrder.getTradeNo());
            if(StringUtils.isNotBlank(alipayPayOrder.getOutUserId())) criteria.andOutUserIdEqualTo(alipayPayOrder.getOutUserId());
            if(StringUtils.isNotBlank(alipayPayOrder.getInUserId())) criteria.andInUserIdEqualTo(alipayPayOrder.getInUserId());
            if(alipayPayOrder.getStatus() != null) criteria.andStatusEqualTo(alipayPayOrder.getStatus());
        }
        if(createTimeStart != null) {
            criteria.andCreateTimeGreaterThanOrEqualTo(createTimeStart);
        }
        if(createTimeEnd != null) {
            criteria.andCreateTimeLessThanOrEqualTo(createTimeEnd);
        }
    }

    void setCriteria(AlipayPayOrderExample.Criteria criteria, AlipayPayOrder alipayPayOrder) {
        if(alipayPayOrder != null) {
            if(StringUtils.isNotBlank(alipayPayOrder.getPayOrderId())) criteria.andPayOrderIdEqualTo(alipayPayOrder.getPayOrderId());
            if(StringUtils.isNotBlank(alipayPayOrder.getTradeNo())) criteria.andTradeNoEqualTo(alipayPayOrder.getTradeNo());
            if(StringUtils.isNotBlank(alipayPayOrder.getOutUserId())) criteria.andOutUserIdEqualTo(alipayPayOrder.getOutUserId());
            if(StringUtils.isNotBlank(alipayPayOrder.getInUserId())) criteria.andInUserIdEqualTo(alipayPayOrder.getInUserId());
            if(alipayPayOrder.getStatus() != null) criteria.andStatusEqualTo(alipayPayOrder.getStatus());
        }
    }

}
